如何优雅地修改antd组件内部样式 | 您所在的位置:网站首页 › reactweditor antd › 如何优雅地修改antd组件内部样式 |
前言
在前端领域,antd无疑是react生态下使用最为广泛的UI类库,antd对常见的表单类输入组件进行了高度封装,带来开箱即用的便利性,但是与此同时,对其样式的控制也愈发困难。大家应该都有过被产品或者交互逼着修改antd样式的经历。次数多了,很难再通过"这是开源的控件,样式不好修改"搪塞过去。那么问题来了,如何优雅第修改antd的样式? 具体方法经过探索,大致有以下几种思路: 直接添加类名或者style 这个是最常规的方法,能够直接作用于当前的元素,但是有的时候我们会发现antd的组件最终在dom层中有很多的层级嵌套。仅仅使用对外层元素进行修改并且让子元素继承样式的方法并不能完全达成目的;这个时候很自然的想法就是使用css的选择器来检索下级元素,大致的代码逻辑如下: import s from './index.css'; import { Input, AutoComplete } from 'antd'; // ...省略无关代码 复制代码css代码 .feeInput .ant-input { background-color: #ffffff !important; font-size: .14rem; color: #555555 !important; user-select: none; } 复制代码接下来我们来检测下成果。
从这里的配置我们可以看到,业务代码使用了css moudle,由于antd的组件使用less编写,这里我们使用了less loader来处理样式,less的部分没有开启css loader故而在dom中看得到的类名还是原始类名。当然,如果你的项目并没有启用css module,直接使用原始类名来控制样式,那就不存在这个问题了。 2. 运用多种css文件打包策略 上文已经分析了问题的根源,接下来就是如何解决问题,最自然的思路就是针对这部分特殊的需求,采用特殊的css样式打包策略,简单来说就是针对antd组件的样式,在外面挂上一个常规的字符串类名,使用单独的css文件来控制样式,在打包的时候,对这种文件采取特殊的策略,即不启用css module,这样就跟antd组件的类名处理方式保持一致,就可以通过css的类名选择器来直接控制样式了。webpack配置如下 module: { rules: [ { // 为了给antd定制样式,使用非获取匹配,反向肯定预查,不使用css module // 文件名中包含antd字样的,不启用css module test: /(?exclude: /node_modules/, use: [ //MiniCssExtractPlugin.loader, 'style-loader', { loader: 'typings-for-css-modules-loader', options: { modules: true, namedExport: true } } ] }, ] } 复制代码针对antd的特殊样式文件,我们其名为index.antd.css,使其不会被css module处理,代码我们做如下修改: import s from './index.css'; import './index.antd.css'; // ...省略无关代码 复制代码在index.antd.css中有如下内容 .feeInput .ant-input { background-color: #ffffff !important; font-size: .14rem; color: #555555 !important; user-select: none; } 复制代码接下来我们看下效果:
js的代码不用引入专门的index.antd.css文件了,css文件这样改: :global(.fee11Input .ant-input) { background-color: #ffffff !important; font-size: .14rem; color: #555555 !important; user-select: none; } 复制代码这种方法由于css语法的限制,导致类名无法被hash化,有污染全局类滚的危险,如果启用了scss,less,sass等等预编译的工具,更加完善的方案是这样 .fee11Input { :global { .ant-input { background-color: #ffffff !important; font-size: .14rem; color: #555555 !important; user-select: none; } } } 复制代码外围的代码要改成css module的方式 复制代码接下来我们看看效果:
|
CopyRight 2018-2019 实验室设备网 版权所有 |